/****************************************************************
 **  Nombre: DAOReticulaAcademica.java                          *
 **  Version: 1.0.0                                             *
 **  Diagrama: GAPI v2.3.1                                      *
 **  Autor: Amado Cante                        *
 **  Creado: 13-febrero-2013
 *   Caso de uso: MGPE1
 **  Modificado: 18-febrero-2013 (Amado Cante)                                               *
 ***************************************************************/
package DAO;
import AccesoBD.AccesoBaseDatos;
import Dominio.Asignatura;
import Dominio.ReticulaAcademica;
import Dominio.Semestre;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
/**
 *
 * Clase que controla el acceso a la base de datos de la reticula academica
 */
public class DAOReticulaAcademica {
    private Connection conexion = null;
    private static final String TABLA_RETICULAS = "reticulas_academicas";
    private static final String COLUMNA_NOMBRE = "nombre";
    private static final String COLUMNA_CVE_RET = "clave_ret_acad";
    private DAOSemestres daosemestres;
    private DAOAsignatura daoasignaturas;
    private DAOAsignaturaReticula daoAsignaturaReticula;
    
    private AccesoBaseDatos acceso = new AccesoBaseDatos();
    /**
     * Constructor de la clase
     */
    public DAOReticulaAcademica(){
        this.conexion = this.acceso.abrirConexion();
    }
    /**
     * Registra una reticula academica
     * @param reticula Objeto de reticula academica.
     * @return La reticula academica registrada.
     */
    public ReticulaAcademica registrarReticulaAcademica(ReticulaAcademica reticula){
        ReticulaAcademica ra = reticula;
        ArrayList<Semestre> semestres = ra.getListaDeSemestres();
        try{
            String nombreRet = ra.getNombre().toUpperCase();
            String queryAltaRet = "INSERT INTO "+TABLA_RETICULAS+" ("+COLUMNA_NOMBRE+") VALUES ('"+nombreRet+"')";
            PreparedStatement sentencia = this.conexion.prepareStatement(queryAltaRet,Statement.RETURN_GENERATED_KEYS);            
            int afectados = sentencia.executeUpdate();
            if (afectados == 0){
                throw new SQLException();
            }else{
                ResultSet generado = sentencia.getGeneratedKeys();
                if(generado.next()){
                    ra.setClaveReticulaAcademica(generado.getInt(1));
                    registrarAsignaturasPorSemestre(semestres,ra.getClaveReticulaAcademica());
                    this.daoAsignaturaReticula = new DAOAsignaturaReticula();
                    this.daoAsignaturaReticula.insertarAsignaturaReticula(semestres);
                    return ra;
                }else{
                    throw new SQLException();
                }
            }
            
        }catch (SQLException ex) {
            System.out.println("Ocurrió un problema al tratar de registrar la retícula");
            ex.printStackTrace();
        }
        return null;
        
    }

    private void registrarAsignaturasPorSemestre(ArrayList<Semestre> semestres,int claveReticula) {
        daoasignaturas = new DAOAsignatura();
        for(int i=0;i<semestres.size();i++){
            ArrayList<Asignatura> asignaturas = semestres.get(i).getListaDeAsignaturas();
            semestres.get(i).setNumeroDeSemestre(i+1);
            semestres.get(i).setClaveReticula(claveReticula);
            for(int j=0;j<asignaturas.size();j++){
                Asignatura insertada = daoasignaturas.registraAsignatura(asignaturas.get(j));
                asignaturas.set(j, insertada);
            }
            daosemestres = new DAOSemestres();
            Semestre s = daosemestres.registraSemestre(semestres.get(i));
            semestres.set(i, s);
        }
    }
    /**
     * Obtiene una reticula academica
     * @param claveReticula Clave de la retivula academica
     * @param cvePrograma Clave del programa educativo
     * @return Reticula academica
     */
    public ReticulaAcademica obtenerReticula(int claveReticula, int cvePrograma){
        DAOSemestres daoSemestre = new DAOSemestres();
        DAOAsignaturaOptativa daoOptativas = new DAOAsignaturaOptativa();
        try{
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            String query="SELECT * FROM "+TABLA_RETICULAS+" WHERE "+COLUMNA_CVE_RET+"='"+claveReticula+"'";
            ResultSet resultado = sentencia.executeQuery(query);
            if(resultado.next()){
                resultado.first();
                int clave = resultado.getInt(1);
                String nombre = resultado.getString(2);
                ArrayList<Semestre> semestres = daoSemestre.obtenerSemestresReticula(claveReticula);
                ReticulaAcademica reticula = new ReticulaAcademica(nombre, semestres);
                reticula.setClaveReticulaAcademica(claveReticula);
                reticula.setAsignaturasOptativas(daoOptativas.obtenerOptativasProgramaEducativo(cvePrograma));
                return reticula;
            }
        }catch (SQLException ex) {
            System.out.println("Ocurrió un problema al tratar de registrar la retícula");
            ex.printStackTrace();
        }
        return null;
    }
    /**
     * Elimina una reticula academica
     * @param claveReticula Clave de la reticula academica
     * @param clavePrograma Clave del programa educativo
     * @return True si se ha eliminado la reticula academica, false en caso contrario
     */
    public boolean eliminarReticula(int claveReticula,int clavePrograma){
        ReticulaAcademica reticula = this.obtenerReticula(claveReticula, clavePrograma);              
        
        ArrayList<Semestre> semestres = reticula.getListaDeSemestres();
        DAOSemestres daoSemestre = new DAOSemestres();
        DAOAsignaturaReticula daoAsignaturasReticula = new DAOAsignaturaReticula();
        
        for(int i=0;i<semestres.size();i++){
            
            int claveSemestre = semestres.get(i).getClaveSemestre();
            
            daoAsignaturasReticula.eliminarAsignaturasReticula(claveSemestre);
            daoSemestre.eliminarSemestre(claveSemestre);
        }
        
        daoAsignaturasReticula.cerrarConexionAAsignaturaReticula();
        
        Statement sentencia = acceso.crearSentenciaBD(conexion);
        String query = "DELETE FROM "+TABLA_RETICULAS+" WHERE "+COLUMNA_CVE_RET+"='"+claveReticula+"';";
        try{
            int afectado = sentencia.executeUpdate(query);
            return(afectado>0);
        }catch(SQLException ex){
            return false;
        }
        
        
    }
}
